package com.itzdm.ws.config;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import com.itzdm.client.domain.po.Message;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @作者：张德明
 * @时间：2025/4/13 16:39
 */
@ServerEndpoint(value = "/ws/chat/{userId}")
@Component
@Slf4j
public class WebSocketSingleServer {

    // 用来存放每个客户端对应的WebSocketSingleServer对象，根据userId分组
    private static final Map<Long, Session> sessionMap = new ConcurrentHashMap<>();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") Long userId) {
        // 添加日志确认 userId 值是否正确
//        log.info("新连接建立: userId = {}, sessionId = {}", userId, session.getId());
        sessionMap.put(userId, session);
        // 添加日志确认是否成功存入
//        log.info("存入session后立即验证: {}", sessionMap.get(userId) != null);
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("userId") Long userId) {
        // 从在线用户列表中移除
        sessionMap.remove(userId);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param content 客户端发送过来的消息
     * @param session 会话
     */
    @OnMessage
    public void onMessage(String content, Session session, @PathParam("userId") Long userId) {
        log.info("收到来自用户{}的消息: {}", userId, content);
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("WebSocket发生错误", error);
    }

    /**
     * 发送消息
     */
    public static void sendMessage(Long userId, Message message) {
        Session session = sessionMap.get(userId);
//        log.info("当前在线用户: {}", sessionMap.keySet());
//        log.info("查找用户 {} 的session: {}", userId, session != null ? session.getId() : "null");
        if (session != null && session.isOpen()) {
            try {
                session.getBasicRemote().sendText(JSON.toJSONString(message));
//                log.info("服务端推送消息到用户{}成功", userId);
            } catch (Exception e) {
                log.error("服务端推送消息失败", e);
            }
        } else {
            log.info("用户{}不在线", userId);
        }
    }

    public static void sendMessage(Long userId, String message) {
        Session session = sessionMap.get(userId);
        if (session != null && session.isOpen()) {
            try {
                session.getBasicRemote().sendText(JSON.toJSONString(message));
                log.info("服务端推送消息到用户{}成功", userId);
            } catch (Exception e) {
                log.error("服务端推送消息失败", e);
            }
        } else {
            log.info("用户{}不在线", userId);
        }
    }
}